package cn.datastruct.three;

/*
    环形数组构建队列:
        1,成员变量
            1.1，maxsize
                1.1.1:数组的长度
            1.2,front
                1.2.1，front指向第一个位置
            1.3,rear
                1.3.1,rear指向最后一个数据的后一个位置，需要空留一个位置出来用来判断队空还是对满
        2，构造函数
        3，成员函数
            3.1，设定arr[maxsize],front,rear,初始化
            3.2，isEmpty(),是否队空，返回boolean类型变量
            3.3, isFull(),是否队满
            3.3,add(int a),添加数据
            3.4，pop()，弹出数据
            3.5，getFront(),获取队头数值
            3.6，打印队列
* */
public class QueueArrayCircle {
    //成员变量
    private int maxsize;
    private int front;
    private int rear;
    private int[] arr;
    //构造函数
    //3.1，设定arr[maxsize],front,rear,初始化

    public QueueArrayCircle(int maxsize) {
        this.maxsize = maxsize;
        this.front = 0;
        this.rear = 0;
        this.arr = new int[maxsize];
    }

    public QueueArrayCircle() {
    }

    //成员函数
    //3.2，isEmpty(),是否队空，返回boolean类型变量
    public boolean isEmpty() {
        return front == rear;
    }

    //3.3, isFull(),是否队满
    public boolean isFull() {
        return (this.rear + 1) % maxsize == front;
    }

    //3.3,add(int a),添加数据
    public void add(int a) {
        if (isFull()) {
            System.out.println("此队列为满，此次操作失败");
            return;
        }
        this.arr[this.rear] = a;
        this.rear = (this.rear + 1) % this.maxsize;
    }

    //3.4，pop()，弹出数据
    public void pop() {

        if (isEmpty()) {
            System.out.println("此队列为空，此次操作失败");
            return;
        }
        this.front = (this.front + 1) % this.maxsize;
    }

    //3.5，getFront(),获取队头数值
    public int getFront() {
        return this.arr[this.front];
    }

    //3.6,得到队列的有效长度
    public int quneuSize(){
        return (this.rear - this.front + this.maxsize) % this.maxsize;
    }
    //3.7，showQuneu(),打印队列
    public void showQuene() {
        if (isEmpty())
            return;
        for (int i = this.front; i < this.front + quneuSize(); i++) {
            System.out.printf("%d\t", this.arr[i % this.maxsize]);
        }
        System.out.println();
    }
}
